# encoding:utf-8
from datetime import datetime
import json
import sys
import re
import click
from unipath import Path, FILES
from typing import Union, Dict, List
from loguru import logger

# 配置日志
logger.remove()  # 移除默认的处理器

# 添加控制台处理器
logger.add(
    sys.stdout,
    format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>",
    level="INFO"
)
# 添加文件处理器
logger.add(
    "logs/jav_process_ai_{time:YYYY-MM-DD}.log",
    rotation="00:00",  # 每天轮换
    retention="30 days",  # 保留30天
    format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
    level="DEBUG",
    encoding="utf-8"
)

"""
click.option()是Python中click包的一个装饰器，用于为命令行接口添加选项参数。它接受以下参数：
name（必需）：选项的名称，通常以短横线开头，如-f或--file。
flag（可选）：布尔标志，如果指定，则该选项不需要值。默认为False。
required（可选）：布尔值，表示该选项是否必须提供。默认为False。
help（可选）：选项的帮助信息，将在命令行中使用--help时显示。
type（可选）：选项的数据类型，例如int、float等。
default（可选）：选项的默认值。
show_default（可选）：布尔值，表示是否在帮助信息中显示默认值。默认为True。
callback（可选）：一个回调函数，当选项被设置时调用。
multiple（可选）：布尔值，表示该选项是否可以多次使用。默认为False。
expose_value（可选）：布尔值，表示是否将选项的值传递给回调函数。默认为True。
"""

# 视频文件
VIDEO_TYPE = ['.mp4', '.avi', '.rmvb', '.wmv', '.mov', '.mkv', '.flv', '.ts', '.webm', '.iso', '.m2ts', '.mpg', '.m4v']
# 字幕类型
SUBTITLES_TYPE = ['.srt', '.ass']
# 脚本目录
SCRIPT_DIR = r'./script'
TEMP_DIR = r'./temp'
RECORD_FILE = r'./data/record_file.txt'


@click.group()
def main():
    pass


@main.command()
@click.option("--source-path", required=True, help="云空间目录")
@click.option("--targer-path", required=True, help="本地目录")
def mirror_copy(source_path, targer_path) -> None:
    """将网盘的文件镜像到本地，对视频文件进行特殊处理。

    :param source_path: 网盘根目录路径
    :param targer_path: 本地根目录路径
    :raises OSError: 当文件操作失败时
    :raises Exception: 其他未预期的错误
    """
    # 转换为 Path 对象
    cloud_path = Path(source_path)
    local_path = Path(targer_path)

    # 验证源目录存在
    if not cloud_path.exists():
        logger.error(f"源目录不存在: {cloud_path}")
        return

    # 确保目标根目录存在
    local_path.mkdir(parents=True)

    try:
        # 遍历源目录下的所有文件
        for source_file in cloud_path.walk(filter=FILES):
            # 计算目标文件路径
            target_file = Path(source_file.replace(cloud_path, local_path))

            # 检查文件是否已存在
            if target_file.exists():
                logger.info(f"文件已存在，跳过: {target_file}")
                continue

            # 创建目标文件父目录
            target_file.parent.mkdir(parents=True)

            # 处理视频文件
            if source_file.ext.lower() in VIDEO_TYPE or source_file.ext.lower() in SUBTITLES_TYPE:
                try:
                    # 根据文件名选择源文件
                    source_template = Path("./scrapy_result/source_move_file.mp4")

                    # 检查模板文件是否存在
                    if not source_template.exists():
                        logger.error(f"模板文件不存在: {source_template}")
                        continue

                    # 复制文件
                    source_template.copy(target_file)
                    logger.success(f"视频文件复制完成: {target_file.name}")

                except Exception as e:
                    logger.error(f"视频文件处理失败: {target_file}")
                    logger.error(f"错误信息: {str(e)}")
                    # 清理失败的文件
                    if target_file.exists():
                        target_file.remove()
                    continue

    except Exception as e:
        logger.error(f"镜像复制过程发生错误: {str(e)}")
        raise


@main.command()
@click.option("--source-path", required=True, help="源目录")
def delete_video_file(source_path) -> None:
    """将网盘的文件镜像到本地，对视频文件进行特殊处理。

    :param source_path: 网盘根目录路径
    :raises OSError: 当文件操作失败时
    :raises Exception: 其他未预期的错误
    """
    # 转换为 Path 对象
    local_path = Path(source_path)
    # 验证源目录存在
    if not local_path.exists():
        logger.error(f"源目录不存在: {local_path}")
        return
    try:
        # 遍历源目录下的所有文件
        for source_file in local_path.walk(filter=FILES):
            # 处理视频文件
            if source_file.ext.lower() in VIDEO_TYPE:
                try:
                    source_file.remove()
                    logger.success(f"删除视频文件: {source_file.name}")

                except Exception as e:
                    logger.error(f"视频文件处理失败: {source_file}")
                    logger.error(f"错误信息: {str(e)}")
                    continue

    except Exception as e:
        logger.error(f"删除视频文件错误: {str(e)}")
        raise


@main.command()
@click.option("--source-path", required=True, help="云空间目录")
@click.option("--targer-path", required=True, help="本地目录")
def create_move_video_file_script(source_path, targer_path) -> None:
    """将网盘的文件镜像到本地，对视频文件进行特殊处理。

    :param source_path: 网盘根目录路径
    :param targer_path: 本地根目录路径
    :raises OSError: 当文件操作失败时
    :raises Exception: 其他未预期的错误
    """
    # 步骤1：构建.laoji文件名与目录的映射
    laoji_map = {}
    # 转换为 Path 对象
    for source_file in Path(source_path).walk(filter=FILES):
        # 处理视频文件
        logger.info(f"文件：{source_file}")
        if source_file.ext.lower() in [".laoji"]:
            laoji_map[source_file.stem] = source_file.parent

    # 步骤2：查找匹配的视频文件
    move_commands = [
        "@echo off",
        "chcp 65001",
        "echo 文件删除脚本",
        "echo 生成时间: %date% %time%",
        "echo.",
        "echo 将要移动以下文件:",
        "echo ----------------------"
    ]

    # 遍历源目录下的所有文件
    for source_file in Path(targer_path).walk(filter=FILES):
        logger.info(f"文件：{source_file}")
        # 处理视频文件
        if source_file.ext.lower() in VIDEO_TYPE:
            if source_file.name in laoji_map:
                logger.success(f"文件：{source_file}")
                dest = laoji_map[source_file.name]
                move_commands.append(f'move /Y "{source_file}" "{dest}"')
    # 步骤3：生成CMD批处理文件
    if move_commands:
        with open(r".\script\move_videos.bat", 'w', encoding='utf-8') as f:
            f.write("@echo off\n")
            f.write("echo 开始移动文件...\n")
            f.write("\n".join(move_commands))
            f.write("\necho 操作完成!\npause")
        print(f"已生成批处理文件: move_videos")
        print("请用管理员身份运行该文件完成文件移动")
    else:
        print("没有找到需要移动的文件")


if __name__ == '__main__':
    """
    
    镜像数据
    python mirror-tools-ai.py mirror-copy --source-path "Y:\数据工厂\脏数据" --targer-path "E:\临时文件\meta-data"

    # 删除视频文件
    python mirror-tools-ai.py delete-video-file --source-path "E:\临时文件\数据工厂\处理完成" 

    # 创建移动视频文件的脚本
    python mirror-tools-ai.py create-move-video-file-script --source-path "Y:\数据工厂\已处理" --targer-path "Y:\数据工厂\脏数据"
    
    # 查找其他前缀的缺失编号
    python jav_process_ai.py find-missing --source "Y:\\艺术视频\\NSFS" --prefix NSFS

    """
    main()
